/**********************************************************************************\
** 文件名称: show.c
** 创建人员: YCG
** 创建日期: 2018-11-20
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include "show.h"

u8 code FontLib[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xf8, 0X80, 0X90, 0xff, 0xc6}; //数码管无小数点字库
u8 code LedLib[]  = {0x01, 0x02, 0X04, 0X08, 0x10, 0x20, 0x40, 0x80};                  //对应Led每排的一个灯

bit FontPoint = 0;                //小数点标志位
bit FontPointFlag = 0;
u8 CubeBuf[4] = {0, 0, 0, 0};     //数码管中显示的数字
u8 CubeBlinkMode[4] = {0, 0, 0, 0};    //闪烁开关
u8 CubeBlinkFlag[4] = {0, 0, 0, 0};    //闪烁标志
u8 LedBuf[8]  = {0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF}; //led显示内容

/*******************************************************************************
** 函数名称: ShowInit
** 功能描述: 初始化
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void ShowInit(void) {

    /*P2口输出低电平显示，设置为开漏 1 1*/
    P2M1 |= B1111_1111;
    P2M0 |= B1111_1111;

    /*共阳端，设置为强上拉输出0 1*/
    P3M1 &= ~B1111_1000;      //清零
    P3M0 |=  B1111_1000;      //置1

    P1M1 &= ~B1111_1100;
    P1M0 |=  B1111_1100;

    P5M1 &= ~B0001_0000;
    P5M0 |=  B0001_0000;

}
/*******************************************************************************
** 函数名称: ShowScan
** 功能描述: 显示扫面函数，每次调用切换一次显示，在定时器1ms中断中调用 
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void ShowScan(void) {
    static u8 num = 0;   //四个数码管，八组LED计数
    static u8 BlinkTime = 0;
    u8 i;     //用于循环计数

    if(++BlinkTime == 250) {               //控制闪烁
        for(i = 0; i < 4; i++) {           //四个数码管控制
            if(CubeBlinkMode[i] == 0) {    //判断当前的工作模式 0为正常模式
                CubeBlinkFlag[i] = 1;      //正常显示
            } else {                       // 非0为闪烁模式
                CubeBlinkFlag[i] = !CubeBlinkFlag[i];   //翻转一次状态
            }
        }
        if(FontPointFlag == 0) {          //小数点闪烁控制
            FontPoint = 1;                //正常显示
        } else {
            FontPoint = ~FontPoint;     //翻转显示
        }
    }

    if(++num > 11) {     //从0-11之间循环显示
        num = 0;
    }
    P2 = 0xff;           //将所有二极管负极置高电平，光闭所有的灯
    S1 = S2 = S3 = S4 = S5 = S6 = S7 = S8 = S9 = S10 = S11 = S12 = 0;//将所有二极管正极置低电平
    switch (num)
    {
    case 0:            //显示数码管右边第一位
        if(CubeBlinkFlag[0]) S1 = 1;          //选通数码管右边第一位
        P2 = FontLib[CubeBuf[0]];     //送入显示数据
        break;
    case 1:            //显示数码管右边第2位
        S2 = 1;          //选通数码管右边第2位
        if(CubeBlinkFlag[1]) {     //闪烁标志
            if(FontPoint) {
                P2 = FontLib[CubeBuf[1]] & B0111_1111;   //送入显示数据，带冒号
            } else {
                P2 = FontLib[CubeBuf[1]];                //送入显示数据，不带冒号
            }
        } else {
            P2 = B0111_1111;     //保持冒号常亮
        }
        break;
    case 2:            //显示数码管右边第3位
        if(CubeBlinkFlag[2]) S3 = 1;          //选通数码管右边第3位
        P2 = FontLib[CubeBuf[2]];     //送入显示数据
        break;

    case 3:            //显示数码管右边第4位
        if(CubeBlinkFlag[3]) S4 = 1;          //选通数码管右边第4位
        P2 = FontLib[CubeBuf[3]];             //送入显示数据
        break;

    case 4:
        S5 = 1;          //选通LED第1排
        P2 = LedBuf[0];  //送入LED显示数据
        break;

    case 5:
        S6 = 1;          //选通LED第2排
        P2 = LedBuf[1];  //送入LED显示数据
        break;

    case 6:
        S7 = 1;          //选通LED第3排
        P2 = LedBuf[2];  //送入LED显示数据
        break;

    case 7:
        S8 = 1;          //选通LED第4排
        P2 = LedBuf[3];  //送入LED显示数据
        break;

    case 8:
        S9 = 1;          //选通LED第5排
        P2 = LedBuf[4];  //送入LED显示数据
        break;

    case 9:
        S10 = 1;          //选通LED第6排
        P2 = LedBuf[5];   //送入LED显示数据
        break;

    case 10:
        S11 = 1;          //选通LED第7排
        P2 = LedBuf[6];   //送入LED显示数据
        break;

    case 11:
        S12 = 1;          //选通LED第8排
        P2 = LedBuf[7];   //送入LED显示数据
        break;
    }
}

/*******************************************************************************
** 函数名称: SetCube
** 功能描述: 设置数码管的显示
** 参数说明: dat: [输入/出]  显示的数据
**			     num: [输入/出]  第几位
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void SetCube(u8 dat, u8 num) {
    CubeBuf[num] = dat;         // 设置显示的数据
}

/*******************************************************************************
** 函数名称: SetCube
** 功能描述: 设置数码管的显示
** 参数说明: num 设置第几个灯闪烁，从左到右（1-4），0表示都不闪
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void SetCubeBlink(u8 num) {
    u8 i;
    for(i = 0; i < 5; i++) {
        if(i == (num - 1)) {
            CubeBlinkMode[i] = 1;
        } else {
            CubeBlinkMode[i] = 0;
        }
    }
}


/*******************************************************************************
** 函数名称: SetLedBit
** 功能描述: 设置Led中的一个灯
** 参数说明: num: [输入] 设置的灯的编号，范围0-63
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void SetLedBit(u8 num) {
    LedBuf[num / 8] &= ~LedLib[num % 8];
}

/*******************************************************************************
** 函数名称: ResetLedBit
** 功能描述: 清除Led中的一个灯
** 参数说明: num: [输入] 清除的灯的编号，范围0-63
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void ResetLedBit(u8 num) {
    LedBuf[num / 8] |= LedLib[num % 8];
}

/*******************************************************************************
** 函数名称: SetLedAll
** 功能描述: 设置Led所有的灯
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void SetLedAll(void) {
    u8 i;
    for(i = 0; i <= 7; i++)
    {
        LedBuf[i] = 0x00;
    }
}

/*******************************************************************************
** 函数名称: ResetLedAll
** 功能描述: 清除Led所有的灯
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void ResetLedAll(void) {
    u8 i;
    for(i = 0; i <= 7; i++)
    {
        LedBuf[i] = 0xff;
    }
}

/*******************************************************************************
** 函数名称: SetPoint
** 功能描述: 冒号显示控制
** 参数说明: p: [输入]  1显示冒号，0不显示冒号
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-20
********************************************************************************/
void SetPoint(u8 p) {
    FontPointFlag = p;
}
/********************************End of File************************************/
